/*!
 * \file CtaStrategyDefs.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief CTA策略定义文件
 * \details 定义了CTA策略的基础类和策略工厂接口，提供CTA策略开发的核心框架
 */
#pragma once
#include <string>
#include <stdint.h>

#include "../Includes/WTSMarcos.h"

NS_WTP_BEGIN
class WTSVariant;
class ICtaStraCtx;
class ICtaTickStraCtx;
class WTSTickData;
struct WTSBarStruct;
NS_WTP_END

USING_NS_WTP;

/**
 * @class CtaStrategy
 * @brief CTA策略基类
 * @details CTA(Commodity Trading Advisor)策略的基础类，提供策略开发的基本框架。
 *          主要功能包括：
 *          - 策略生命周期管理
 *          - 市场数据事件处理
 *          - 交易会话事件处理
 *          - 调度任务执行
 *          
 *          CTA策略主要用于期货和衍生品的中频交易，通常基于技术分析
 *          和趋势跟踪进行交易决策。策略开发者需要继承此类并实现
 *          相应的事件处理方法。
 */
class CtaStrategy
{
public:
	/**
	 * @brief 构造函数
	 * @param id 策略实例ID
	 */
	CtaStrategy(const char* id) :_id(id){}
	virtual ~CtaStrategy(){}

public:
	/**
	 * @brief 获取策略名称
	 * @details 返回策略的唯一标识名称，用于策略识别和管理。
	 * @return const char* 策略名称
	 */
	virtual const char* getName() = 0;

	/**
	 * @brief 获取策略工厂名称
	 * @details 返回创建此策略的工厂名称，用于策略来源追踪。
	 * @return const char* 策略工厂名称
	 */
	virtual const char* getFactName() = 0;

	/**
	 * @brief 策略初始化
	 * @details 策略启动时的初始化方法，用于加载配置和设置初始状态。
	 * @param cfg 配置参数对象
	 * @return bool true表示初始化成功，false表示失败
	 */
	virtual bool init(WTSVariant* cfg){ return true; }

	/**
	 * @brief 获取策略实例ID
	 * @return const char* 策略实例ID
	 */
	virtual const char* id() const { return _id.c_str(); }

	/**
	 * @brief 策略初始化回调
	 * @details 策略框架初始化完成后的回调函数，可以在此进行策略特定的初始化操作。
	 * @param ctx CTA策略上下文指针
	 */
	virtual void on_init(ICtaStraCtx* ctx){}

	/**
	 * @brief 交易会话开始回调
	 * @details 每个交易日会话开始时的回调函数，可以在此进行日初处理。
	 * @param ctx CTA策略上下文指针
	 * @param uTDate 交易日期，格式为yyyyMMdd
	 */
	virtual void on_session_begin(ICtaStraCtx* ctx, uint32_t uTDate) {}

	/**
	 * @brief 交易会话结束回调
	 * @details 每个交易日会话结束时的回调函数，可以在此进行日终处理。
	 * @param ctx CTA策略上下文指针
	 * @param uTDate 交易日期，格式为yyyyMMdd
	 */
	virtual void on_session_end(ICtaStraCtx* ctx, uint32_t uTDate) {}

	/**
	 * @brief 调度逻辑执行回调
	 * @details 定时调度任务执行时的回调函数，可以在此进行定期的策略逻辑处理。
	 * @param ctx CTA策略上下文指针
	 * @param uDate 日期，格式为yyyyMMdd
	 * @param uTime 时间，格式为HHMMss或HHMMssmmm
	 */
	virtual void on_schedule(ICtaStraCtx* ctx, uint32_t uDate, uint32_t uTime){}

	/**
	 * @brief 调度逻辑执行完成回调
	 * @details 定时调度任务执行完成后的回调函数，可以在此进行后续处理。
	 * @param ctx CTA策略上下文指针
	 * @param uDate 日期，格式为yyyyMMdd
	 * @param uTime 时间，格式为HHMMss或HHMMssmmm
	 */
	virtual void on_schedule_done(ICtaStraCtx* ctx, uint32_t uDate, uint32_t uTime) {}

	/**
	 * @brief Tick数据回调
	 * @details 实时tick数据到达时的回调函数，可以在此进行高频数据处理。
	 * @param ctx CTA策略上下文指针
	 * @param stdCode 标准合约代码
	 * @param newTick 新的tick数据
	 */
	virtual void on_tick(ICtaStraCtx* ctx, const char* stdCode, WTSTickData* newTick){}

	/**
	 * @brief K线数据回调
	 * @details K线数据更新时的回调函数，可以在此进行基于K线的策略逻辑。
	 * @param ctx CTA策略上下文指针
	 * @param stdCode 标准合约代码
	 * @param period K线周期，如"m1"、"m5"、"d1"等
	 * @param newBar 新的K线数据
	 */
	virtual void on_bar(ICtaStraCtx* ctx, const char* stdCode, const char* period, WTSBarStruct* newBar){}

protected:
	std::string _id;	///< 策略实例ID
};

//////////////////////////////////////////////////////////////////////////
/// @brief 策略枚举回调函数类型
/// @param factName 工厂名称
/// @param straName 策略名称
/// @param isLast 是否为最后一个策略
typedef void(*FuncEnumStrategyCallback)(const char* factName, const char* straName, bool isLast);

/**
 * @class ICtaStrategyFact
 * @brief CTA策略工厂接口
 * @details CTA策略工厂的核心接口，负责策略的创建、删除和管理。
 *          主要功能包括：
 *          - 策略实例创建和销毁
 *          - 策略类型枚举
 *          - 工厂标识管理
 *          
 *          策略工厂采用工厂模式设计，支持动态加载和卸载策略模块，
 *          为策略系统提供灵活的扩展机制。
 */
class ICtaStrategyFact
{
public:
	ICtaStrategyFact(){}
	virtual ~ICtaStrategyFact(){}

public:
	/**
	 * @brief 获取工厂名称
	 * @details 返回策略工厂的唯一标识名称。
	 * @return const char* 工厂名称
	 */
	virtual const char* getName() = 0;

	/**
	 * @brief 枚举策略
	 * @details 枚举工厂支持的所有策略类型，通过回调函数返回策略信息。
	 * @param cb 枚举回调函数，用于接收策略信息
	 */
	virtual void enumStrategy(FuncEnumStrategyCallback cb) = 0;

	/**
	 * @brief 根据策略名称创建策略实例
	 * @details 根据指定的策略名称和实例ID创建新的策略实例。
	 * @param name 策略名称
	 * @param id 策略实例ID
	 * @return CtaStrategy* 策略实例指针，创建失败返回nullptr
	 */
	virtual CtaStrategy* createStrategy(const char* name, const char* id) = 0;

	/**
	 * @brief 删除策略实例
	 * @details 销毁指定的策略实例并释放相关资源。
	 * @param stra 要删除的策略实例指针
	 * @return bool true表示删除成功，false表示失败
	 */
	virtual bool deleteStrategy(CtaStrategy* stra) = 0;
};

/// @brief 创建策略工厂函数指针类型
typedef ICtaStrategyFact* (*FuncCreateStraFact)();

/// @brief 删除策略工厂函数指针类型
typedef void(*FuncDeleteStraFact)(ICtaStrategyFact* &fact);
